import java.util.concurrent.*;

public class Test {
    public static void main(String[] args) throws InterruptedException {
        // HashMap 只给 CRUD，ConcurrentHashMap 额外给原子复合更新、弱一致迭代、并行聚合、无锁读，既安全又高速
        ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap<>();
        int[] arr = { 1, 2, 3, 4, 5 };
        for (int i : arr) {
            Thread t = new Thread(() -> {
                map.put(i, "Value" + i);
            });
            Thread t2 = new Thread(() -> {
                System.out.println("读进程： " + map.get(i));
            });
            t.start();
            t.join();
            t2.start();
            t2.join();
        }
    }

}
// BlockingQueue的意思就是说，当一个线程调用这个TaskQueue的getTask()方法时，该方法内部可能会让线程变成等待状态，直到队列条件满足不为空，线程被唤醒后，getTask()方法才会返回。
// 因为BlockingQueue非常有用，所以我们不必自己编写，可以直接使用Java标准库的java.util.concurrent包提供的线程安全的集合：ArrayBlockingQueue。
// 除了BlockingQueue外，针对List、Map、Set、Deque等，java.util.concurrent包也提供了对应的并发集合类。我们归纳一下

// | interface | non-thread-safe         | thread-safe                              |
// | --------- | ----------------------- | ---------------------------------------- |
// | List      | ArrayList               | CopyOnWriteArrayList                     |
// | Map       | HashMap                 | ConcurrentHashMap                        |
// | Set       | HashSet / TreeSet       | CopyOnWriteArraySet                      |
// | Queue     | ArrayDeque / LinkedList | ArrayBlockingQueue / LinkedBlockingQueue |
// | Deque     | ArrayDeque / LinkedList | LinkedBlockingDeque                      |
